#ifndef COUNT_H_
#define COUNT_H_

#include "../../SAMA_Function.h"

//< 触发类型
typedef enum {
	COUNT_TOUGH_UP,			//< 上升沿
	COUNT_TOUGH_DOWN,		//< 下降沿
	COUNT_TOUGH_ANY,		//< 任意沿
}COUNT_TOUGH_TYPE;

//< 计数方向
typedef enum {
	FORWARD,	//< 正向
	BACKWARD,	//< 逆向
}COUNT_DIRECTION_TYPE;

/*模块可调参数结构体*/
typedef struct {
	COUNT_TOUGH_TYPE Tough_Type;			//< 触发方式
	COUNT_DIRECTION_TYPE Direction_Type;	//< 计数方向
	int max_count_num;						//< 计数器最大计数次数
}COUNT_Par_t;


/*模块运算中间参数结构体定义*/
typedef struct {
	bool CP_Last;			//< 上一时刻时钟脉冲信号
	int Count_Num;			//< 计数值	
	bool Init_Flag;			//< 初始化标志
}COUNT_Sta_t;


/*模块参数结构体定义*/
struct COUNT_T
{
	Model_Base_t Base;		//< 模块基本参数结构体
	COUNT_Par_t Par;		//< 模块可调参数结构体
	COUNT_Sta_t Sta;		//< 模块运算中间参数结构体
};


extern COUNT_T* COUNT_t;

/*函数*/
bool CALCU_SAMA(COUNT)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO);	//< SAMA运算函数
int BC_PARA(COUNT)(Model_Base_t* arg, void** Data);												//< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
int BAK_STA(COUNT)(Model_Base_t* arg, void** Data);												//< 备份SAMA运算中间参数
int ANA_STA(COUNT)(Model_Base_t* arg, void** Data);												//< 解析备份的SAMA运算中间参数
int CHANGE_PAR(COUNT)(Model_Base_t* arg, void** Data);											//< 在线修改模块参数
void INIT_STAPAR(COUNT)(Model_Base_t* arg);														//< 初始化模块运算中间参数


#endif
